Me he encontrado con este código:
var rectangle = new Rectangle(420, 69); var newOne = rectangle with { Width = 420 } Me preguntaba acerca with la palabra clave en el código C#. ¿Para qué sirve? ¿Y cómo se puede usar? ¿Y qué beneficios aporta a la lengua?
Es un operador que se usa en expresiones para facilitar la duplicación de un objeto, anulando algunas de sus propiedades/campos públicos (opcional) con expresión - MSDN
Actualmente solo se puede utilizar con registros. Pero tal vez no habrá tal restricción en el futuro (suposición).
Aquí hay un ejemplo de cómo se puede usar:
// Declaring a record with a public property and a private field record WithOperatorTest { private int _myPrivateField; public int MyProperty { get; set; } public void SetMyPrivateField(int a = 5) { _myPrivateField = a; } } Ahora veamos cómo se puede usar with operator:
var firstInstance = new WithOperatorTest { MyProperty = 10 }; firstInstance.SetMyPrivateField(11); var copiedInstance = firstInstance with { }; // now "copiedInstance" also has "MyProperty" set to 10 and "_myPrivateField" set to 11. var thirdCopiedInstance = copiedInstance with { MyProperty = 100 }; // now "thirdCopiedInstance " also has "MyProperty" set to 100 and "_myPrivateField" set to 11. thirdCopiedInstance.SetMyPrivateField(-1); // now "thirdCopiedInstance " also has "MyProperty" set to 100 and "_myPrivateField" set to -1.NOTA para tipos de referencia de MSDN:
En el caso de un miembro de tipo de referencia, solo se copia la referencia a una instancia de miembro cuando se copia un operando. Tanto el operando de copia como el original tienen acceso a la misma instancia de tipo de referencia.
Esa lógica se puede modificar modificando el constructor de copia de un tipo de registro. Cita de MSDN:
De forma predeterminada, el constructor de copias es implícito, es decir, generado por el compilador. Si necesita personalizar la semántica de copia de registro, declare explícitamente un constructor de copia con el comportamiento deseado.
protected WithOperatorTest(WithOperatorTest original) { // Logic to copy reference types with new reference }Y en términos de los beneficios que brinda, creo que ahora debería ser bastante obvio que hace que la copia de instancias sea mucho más fácil y conveniente.
Básicamente, el operador with creará una nueva instancia de objeto (solo registros, por ahora), al "hacer frente a los valores" del objeto "fuente" y anular algunas propiedades con nombre en el objeto de destino.
Por ejemplo, en lugar de hacer esto:
var person = new Person("John", "Doe") { MiddleName = "Patrick" }; var modifiedPerson = new Person(person.FirstName, person.LastName) { MiddleName = "William" };Puedes hacerlo:
var modifiedPerson = person with { MiddleName = "Patrick" };Básicamente, escribirás menos código.
Use esta fuente para obtener más detalles sobre el ejemplo anterior y la documentación oficial para obtener más ejemplos.
La respuesta corta es la siguiente: se agregó with palabra clave en C# para facilitar la copia de objetos complicados, con la posibilidad de anular algunas de las propiedades públicas. Los ejemplos ya se proporcionan brevemente en la respuesta aceptada.